//设计一个算法，判断玩家是否赢了井字游戏。输入是一个 N x N 的数组棋盘，由字符" "，"X"和"O"组成，其中字符" "代表一个空位。 
//
// 以下是井字游戏的规则： 
//
// 
// 玩家轮流将字符放入空位（" "）中。 
// 第一个玩家总是放字符"O"，且第二个玩家总是放字符"X"。 
// "X"和"O"只允许放置在空位中，不允许对已放有字符的位置进行填充。 
// 当有N个相同（且非空）的字符填充任何行、列或对角线时，游戏结束，对应该字符的玩家获胜。 
// 当所有位置非空时，也算为游戏结束。 
// 如果游戏结束，玩家不允许再放置字符。 
// 
//
// 如果游戏存在获胜者，就返回该游戏的获胜者使用的字符（"X"或"O"）；如果游戏以平局结束，则返回 "Draw"；如果仍会有行动（游戏未结束），则返回 
//"Pending"。 
//
// 示例 1： 
//
// 输入： board = ["O X"," XO","X O"]
//输出： "X"
// 
//
// 示例 2： 
//
// 输入： board = ["OOX","XXO","OXO"]
//输出： "Draw"
//解释： 没有玩家获胜且不存在空位
// 
//
// 示例 3： 
//
// 输入： board = ["OOX","XXO","OX "]
//输出： "Pending"
//解释： 没有玩家获胜且仍存在空位
// 
//
// 提示： 
//
// 
// 1 <= board.length == board[i].length <= 100 
// 输入一定遵循井字棋规则 
// 
//
// Related Topics 数组 计数 矩阵 👍 46 👎 0


package LeetCode.editor.cn;

/**
 * @author ldltd
 * @date 2025-09-06 13:38:52
 * @description 面试题 16.04.井字游戏
 */
public class TicTacToeLcci{
	 public static void main(String[] args) {
	 	 //测试代码
	 	 TicTacToeLcci fun=new TicTacToeLcci();
	 	 Solution solution = fun.new Solution();

	 }
	 
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public String tictactoe(String[] board) {
		int len = board.length;
		int[] r=new int[len];
		int [] c=new int[len];
		int left=0,right=0;
		boolean pending=false;
		boolean X=false;
		boolean O=false;
		for (int i = 0; i < board.length; i++) {
			char[] charArray = board[i].toCharArray();
			for (int j = 0; j < charArray.length; j++) {
				if(charArray[j]==' ') {
					pending=true;
					continue;
				}
				int add=charArray[j]=='X'?1:-1;
				r[i]+=add;
				c[j]+=add;
				if(i==j) left+=add;
				if(j+i==len-1) right+=add;
				if(r[i]==len||c[j]==len||left==len||right==len) X=true;
				if(r[i]==-len||c[j]==-len||left==-len||right==-len) O=true;
				if(X&&O) return "Draw";
				if(X) return "X";
				if(O) return "O";
			}

		}
		return pending?"Pending":"Draw";
	}
}
//leetcode submit region end(Prohibit modification and deletion)

}
